package com.casa_apoio.estoque.suport;

import com.casa_apoio.conversores.NumeroDiariasRelatorio;
import com.casa_apoio.estoque.mode.dao.EntradaDAO;
import com.casa_apoio.estoque.mode.dao.EstoqueDAO;
import com.casa_apoio.estoque.mode.dao.FornecedorDAO;
import com.casa_apoio.estoque.mode.entity.CabEstoque;
import com.casa_apoio.estoque.mode.entity.Entrada;
import com.casa_apoio.estoque.mode.entity.Fornecedor;
import com.casa_apoio.model.entity.Cidade;
import com.casa_apoio.model.entity.Hospedagem;
import com.casa_apoio.util.FacesContextUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean
@ViewScoped
public class RelatorioEntrada implements Serializable {

    private static final long serialVersionUID = 1L;
    private List<Entrada> itensEntradas;
    private List<CabEstoque> entradas;
    private String tipo;
    private Date dataInicio, dataFinal;
    private int idFornecedor;
    private List<Fornecedor> fornecedores;
    private StreamedContent arquivoRetorno;
    private StreamedContent arquivoRetornoAnalitico;

    private EntradaDAO entradaDAO() {
        EntradaDAO<CabEstoque> dao = new EntradaDAO<CabEstoque>(CabEstoque.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private EstoqueDAO estoqueDAO() {
        EstoqueDAO<Entrada> dao = new EstoqueDAO<Entrada>(Entrada.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private FornecedorDAO fornecedorDAO() {
        FornecedorDAO<Fornecedor> dao = new FornecedorDAO<Fornecedor>(Fornecedor.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    public String relatorioPeriodo() {
        if (tipo.equals("1")) {
            entradas = entradaDAO().relarotioTodosPeriodo(dataInicio, dataFinal);
        }

        if (tipo.equals("2")) {
            if (idFornecedor > 0) {
                entradas = entradaDAO().relarotioFornecedorPeriodo(dataInicio, dataFinal, idFornecedor);
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione um Fonecedor", ""));
                return null;
            }
        }

        if (entradas != null) {
            if (entradas.size() > 0) {
                for (CabEstoque e : entradas) {
                    System.out.println("Entrada " + e.getIdCabEstoque() + " Fornecedor " + e.getFornecedor().getNomeFantasia() + " Data Entrada " + e.getDataMovimentacao());
                }
            }
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Lançamento não encontrado verefique a consulta", ""));
        }

        return null;
    }

    public StreamedContent getArquivoRetorno() throws FileNotFoundException, IOException, DocumentException {
        Document document = new Document(PageSize.A4);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("CASA DE APOIO SANTA MARIA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);

        SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy");
        Paragraph p = new Paragraph("Relatório de Entrada de Produtos            Período " + sfd.format(dataInicio) + " á " + sfd.format(dataFinal));
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);
        try {
            Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
            Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);
            if (entradas.size() > 0) {

                PdfPTable table = new PdfPTable(new float[]{0.04f, 0.08f, 0.06f, 0.087f, 0.38f, 0.05f});

                table.setSpacingBefore(5.0f);
                table.setWidthPercentage(100.0f);

                table.setHorizontalAlignment(Element.ALIGN_LEFT);

                table.addCell(new Phrase("Código", fh));
                table.addCell(new Phrase("DT. Entrada", fh));
                table.addCell(new Phrase("Nº Doc", fh));
                table.addCell(new Phrase("DT. Emissão", fh));
                table.addCell(new Phrase("Fornecedor", fh));
                table.addCell(new Phrase("Valor", fh));
                double vlrTotal = 0;
                for (CabEstoque e : entradas) {
                    table.addCell(new Phrase(String.valueOf(e.getIdCabEstoque()), fc));
                    table.addCell(new Phrase(String.valueOf(sfd.format(e.getDataMovimentacao())), fc));
                    table.addCell(new Phrase(e.getNumDocumento(), fc));
                    table.addCell(new Phrase(String.valueOf(sfd.format(e.getDataNF())), fc));
                    table.addCell(new Phrase(e.getFornecedor().getNomeFantasia(), fc));
                    table.addCell(new Phrase(String.valueOf(e.getVlrTotal()), fc));
                    vlrTotal += e.getVlrTotal();
                }
                document.add(table);
                NumberFormat nf = NumberFormat.getCurrencyInstance();
                Paragraph p3 = new Paragraph("Valor Total " + nf.format(vlrTotal), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                p3.setAlignment(Element.ALIGN_RIGHT);
                document.add(p3);
            }
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro ao tentar Gerar o Relatório", "Erro"));
        }
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetorno = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetorno;
    }

    public StreamedContent getArquivoRetornoAnalitico() throws FileNotFoundException, IOException, DocumentException {
        Document document = new Document(PageSize.A4.rotate());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter.getInstance(document, baos);
        document.open();

        Font f = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Paragraph t1 = new Paragraph("CASA DE APOIO SANTA MARIA", f);
        t1.setAlignment(Element.ALIGN_CENTER);
        document.add(t1);

        Paragraph t2 = new Paragraph("SORRISO - MT", f);
        t2.setAlignment(Element.ALIGN_CENTER);
        document.add(t2);
        SimpleDateFormat sfd = new SimpleDateFormat("dd/MM/yyyy");
        NumberFormat nf = NumberFormat.getCurrencyInstance();
        double vlrTotalGeral = 0;

        Paragraph p = new Paragraph("Relatório de Entrada de Produtos            Período " + sfd.format(dataInicio) + " á " + sfd.format(dataFinal));
        p.setAlignment(Element.ALIGN_CENTER);
        document.add(p);

        Font fc = new Font(Font.FontFamily.TIMES_ROMAN, 8);
        Font fh = new Font(Font.FontFamily.TIMES_ROMAN, 8, Font.BOLD);

        for (CabEstoque c : entradas) {

            Paragraph p2 = new Paragraph(c.getFornecedor().getNomeFantasia() + "  " + sfd.format(c.getDataMovimentacao()) + "  " + c.getNumDocumento(), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
            p2.setAlignment(Element.ALIGN_LEFT);
            document.add(p2);

            PdfPTable table = new PdfPTable(new float[]{0.04f, 0.38f, 0.06f, 0.087f, 0.08f, 0.05f});
            table.setSpacingBefore(5.0f);
            table.setWidthPercentage(100.0f);

            table.setHorizontalAlignment(Element.ALIGN_LEFT);
            itensEntradas = null;
            itensEntradas = estoqueDAO().entradaEstoqueFinalizada(c.getIdCabEstoque());

            if (itensEntradas.size() > 0) {
                table.addCell(new Phrase("Código", fh));
                table.addCell(new Phrase("Produto", fh));
                table.addCell(new Phrase("Validade", fh));
                table.addCell(new Phrase("Qtde", fh));
                table.addCell(new Phrase("Vlr Uni", fh));
                table.addCell(new Phrase("Sub Total", fh));
                double vlrTotal = 0;

                for (Entrada i : itensEntradas) {
                    try {
                        table.addCell(new Phrase(String.valueOf(i.getProduto().getIdProduto()), fc));
                        table.addCell(new Phrase(i.getProduto().getDescricao(), fc));

                        try {
                            table.addCell(new Phrase(String.valueOf(sfd.format(i.getValidade())), fc));
                        } catch (Exception e) {
                            table.addCell(new Phrase("", fc));
                        }
                        table.addCell(new Phrase(String.valueOf(i.getQuantidade()), fc));
                        table.addCell(new Phrase(String.valueOf(nf.format(i.getValor())), fc));
                        table.addCell(new Phrase(String.valueOf(nf.format(i.getValor() * i.getQuantidade())), fc));
                        vlrTotal += i.getValor() * i.getQuantidade();
                    } catch (Exception e) {

                    }
                }
                document.add(table);
                Paragraph p3 = new Paragraph("Total NF " + nf.format(vlrTotal), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
                p3.setAlignment(Element.ALIGN_RIGHT);
                document.add(p3);
                vlrTotalGeral += vlrTotal;

            }
        }
        Paragraph p4;
        p4 = new Paragraph("______________________", new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
        p4.setAlignment(Element.ALIGN_RIGHT);
        document.add(p4);
        p4 = new Paragraph("Total Geral " + nf.format(vlrTotalGeral), new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.BOLD));
        p4.setAlignment(Element.ALIGN_RIGHT);
        document.add(p4);
        document.close();
        FileOutputStream fos = new FileOutputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        InputStream arquivo = new FileInputStream("C:\\PDF\\arqPDFexemplo2.pdf");
        fos.write(baos.toByteArray());
        fos.close();

        arquivoRetornoAnalitico = new DefaultStreamedContent(arquivo, "application/pdf", "reltorio.pdf");

        return arquivoRetornoAnalitico;
    }

    @PostConstruct
    private void checkedRadio() {
        tipo = "1";
    }

    public List<Entrada> getItensEntradas() {
        return itensEntradas;
    }

    public void setItensEntradas(List<Entrada> itensEntradas) {
        this.itensEntradas = itensEntradas;
    }

    public List<CabEstoque> getEntradas() {
        return entradas;
    }

    public void setEntradas(List<CabEstoque> entradas) {
        this.entradas = entradas;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Date getDataInicio() {
        return dataInicio;
    }

    public void setDataInicio(Date dataInicio) {
        this.dataInicio = dataInicio;
    }

    public Date getDataFinal() {
        return dataFinal;
    }

    public void setDataFinal(Date dataFinal) {
        this.dataFinal = dataFinal;
    }

    public int getIdFornecedor() {
        return idFornecedor;
    }

    public void setIdFornecedor(int idFornecedor) {
        this.idFornecedor = idFornecedor;
    }

    public List<Fornecedor> getFornecedores() {
        if (fornecedores == null) {
            fornecedores = fornecedorDAO().listaDeFornecedor();
        }
        return fornecedores;
    }

    public void setFornecedores(List<Fornecedor> fornecedores) {
        this.fornecedores = fornecedores;
    }
}
